package com.iceframework.core.utils;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class FreemarkerUtils {

	private Configuration cfg;
	private String ftlPath;

	public FreemarkerUtils(String ftlPath) {
		this.ftlPath = ftlPath;
	}

	public void init() throws Exception {
		// 初始化FreeMarker配置
		// 创建一个Configuration实例
		cfg = new Configuration(Configuration.VERSION_2_3_28);
		// cfg.setClassForTemplateLoading(FreemarkerUtil.class, "/ftl");
		// 设置FreeMarker的模版文件夹位置
		cfg.setDirectoryForTemplateLoading(new File(ftlPath));
	}

	/**
	 * 解析模板 生成文件
	 * 
	 * @param fileName 模板文件名
	 * @param map      构造填充数据的Map
	 * @param outFile  输出文件
	 * @throws Exception
	 */
	public void processToFile(String fileName, Map<String,Object> map, File outFile) throws Exception {
		// 构造填充数据的Map
		// 创建模版对象
		Template t = cfg.getTemplate(fileName);
		// 在模版上执行插值操作，并输出到制定的输出流中
		// t.process(map, new OutputStreamWriter(System.out));
		Writer out = null;
		try {
			out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"));
			t.process(map, out);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (out != null)
				out.close();
		}
	}

	/**
	 * 解析模板 打印到控制台
	 * 
	 * @param fileName 模板文件名
	 * @param map      构造填充数据的Map
	 * @param outFile  输出文件
	 * @throws Exception
	 */
	public void process(String fileName, Map<String,Object> map) throws Exception {
		// 构造填充数据的Map
		// 创建模版对象
		Template t = cfg.getTemplate(fileName, "UTF-8");
		// 在模版上执行插值操作，并输出到制定的输出流中
		// t.process(map, new OutputStreamWriter(System.out));

		Writer out = null;
		try {
			// 在模版上执行插值操作，并输出到制定的输出流中
			out = new OutputStreamWriter(System.out);
			t.process(map, out);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (out != null)
				out.close();
		}
	}

	/**
	 * 解析模板 返回字符串
	 * 
	 * @param fileName 模板文件名
	 * @param map      构造填充数据的Map
	 * @param outFile  输出文件
	 * @throws Exception
	 */
	public String processToString(String fileName, Map<String,Object> map) throws Exception {
		// 构造填充数据的Map
		// 创建模版对象
		Template t = cfg.getTemplate(fileName, "UTF-8");
		Writer out = null;
		String str = "";
		try {
			out = new StringWriter(2048);
			t.process(map, out);
			str = out.toString();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (out != null)
				out.close();
		}
		return str;
	}

	public static String processToString(String ftpPath, String fileName, Object obj) throws Exception {
		// 初始化FreeMarker配置
		// 创建一个Configuration实例
		Configuration cfg = new Configuration(Configuration.VERSION_2_3_28);
		// 设置FreeMarker的模版文件夹位置
		cfg.setDirectoryForTemplateLoading(new File(ftpPath));
		// 构造填充数据的Map
		// 创建模版对象
		Template t = cfg.getTemplate(fileName, "UTF-8");
		Writer out = null;
		String str = "";
		try {
			out = new StringWriter(2048);
			t.process(obj, out);
			str = out.toString();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (out != null)
				out.close();
		}
		return str;
	}

}
